<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>第九章：实际应用案例 - 9.5 构建特定角色的AI应用</title>
    <link rel="stylesheet" href="../shared_styles.css">
</head>
<body>
    <div class="container">
        <h1> 第九章：实际应用案例</h1>
        <section id="s9-5">
            <h2>9.5 如何利用Langchain和提示词构建具有特定角色的AI应用（如客服助手、编程助手）</h2>
            <p>赋予LLM特定的“角色”是提升其在特定任务上表现的关键技巧。通过精心设计的系统提示词（System Prompt），我们可以指示LLM扮演某个角色（如经验丰富的客服、资深程序员、专业的医学顾问等），并按照该角色的行为模式、知识范围和沟通风格进行交互。</p>
            <p>在本节中，我们将探讨如何：</p>
            <ol>
                <li>设计有效的系统提示词来定义AI的角色、职责、行为准则和沟通风格。</li>
                <li>结合Langchain的<code>ChatPromptTemplate</code>和Qwen模型，创建特定角色的AI助手。</li>
                <li>演示两个具体案例：一个简单的客服助手和一个基础的编程助手。</li>
            </ol>
            <p>核心在于提示工程（Prompt Engineering），特别是系统消息的设计。</p>

            <h3>准备工作：初始化Qwen LLM</h3>
            <pre><code class="language-python">
from langchain_openai import ChatOpenAI # Qwen兼容
from langchain_core.prompts import ChatPromptTemplate, SystemMessagePromptTemplate, HumanMessagePromptTemplate
from langchain_core.output_parsers import StrOutputParser
from dotenv import load_dotenv
import os

# 加载环境变量
load_dotenv()
api_key = os.environ.get("DASHSCOPE_API_KEY")
if not api_key:
    raise ValueError("DASHSCOPE_API_KEY not found. Please set it in your .env file.")

# 初始化Qwen聊天模型
qwen_llm = ChatOpenAI(
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    api_key=api_key,
    model="qwen-plus", 
    temperature=0.5, # 根据角色需求调整，客服可能需要更稳定，编程助手可能需要一些创造性
    streaming=False
)
print("Qwen LLM 初始化成功。")
            </code></pre>

            <h3>案例1：构建一个简单的客服助手</h3>
            <p>假设我们需要一个AI客服助手，负责回答关于某款虚拟产品“星梦云盘”的常见问题。它应该友好、耐心，并能提供准确的产品信息。</p>

            <h4>步骤1：设计客服助手的系统提示词</h4>
            <p>系统提示词需要明确客服的角色、产品知识范围和沟通要求。</p>
            <pre><code class="language-python">
customer_service_system_prompt = """
你是“星梦云盘”的高级客户服务代表。你的名字叫小星。
你的职责是友好、耐心且准确地回答用户关于“星梦云盘”产品的问题。

关于“星梦云盘”的核心信息：
- 功能：提供安全可靠的云存储服务，支持文件同步、分享和大文件传输。
- 套餐：
    - 免费版：5GB存储空间，单文件上传上限100MB。
    - 个人版：1TB存储空间，单文件上传上限5GB，月费30元。
    - 家庭版：5TB存储空间，可供5人共享，单文件上传上限10GB，月费80元。
- 特色：端到端加密，多平台客户端支持（Windows, macOS, Android, iOS, Web）。
- 常见问题解答：
    - Q: 如何升级套餐？ A: 您可以在“星梦云盘”APP或官网的“我的账户”页面找到升级选项。
    - Q: 文件分享有有效期吗？ A: 用户可以自定义分享链接的有效期和访问密码。
    - Q: 是否支持离线访问？ A: 是的，通过客户端可以将文件标记为离线可用。

沟通准则：
- 始终保持礼貌和专业。
- 如果用户的问题超出了你的知识范围，请礼貌地表示你暂时无法回答，并建议用户联系人工客服或查阅官方文档。
- 不要编造信息。
- 尽量使用简洁明了的语言。
"""
            </code></pre>

            <h4>步骤2：创建客服助手的聊天提示模板和链</h4>
            <pre><code class="language-python">
customer_service_prompt_template = ChatPromptTemplate.from_messages([
    SystemMessagePromptTemplate.from_template(customer_service_system_prompt),
    HumanMessagePromptTemplate.from_template("{user_query}")
])

customer_service_chain = customer_service_prompt_template | qwen_llm | StrOutputParser()

print("\n--- 案例1：简单客服助手 ---")
print("客服助手小星已上线，您可以开始提问了。")

def ask_customer_service(query):
    print(f"\n用户: {query}")
    try:
        response = customer_service_chain.invoke({"user_query": query})
        print(f"小星: {response}")
    except Exception as e:
        print(f"客服助手出错: {e}")

# 测试对话
ask_customer_service("你好，我想了解一下星梦云盘的个人版套餐。")
ask_customer_service("免费版可以上传多大的文件？")
ask_customer_service("你们支持哪些操作系统？")
ask_customer_service("星梦云盘的CEO是谁？") # 测试超出知识范围的情况
            </code></pre>
            <p>在这个例子中，系统提示词为LLM提供了扮演客服角色所需的全部背景信息和行为指南。LLM会尝试在其“知识范围”（即系统提示中提供的信息）内回答问题。</p>

            <h3>案例2：构建一个基础的编程助手</h3>
            <p>现在我们来构建一个能提供Python编程建议和简单代码片段的AI助手。</p>

            <h4>步骤1：设计编程助手的系统提示词</h4>
            <p>这个系统提示词将强调其作为Python编程专家的角色，并鼓励它提供代码示例。</p>
            <pre><code class="language-python">
programming_assistant_system_prompt = """
你是一个经验丰富的Python编程专家，名为“码师爷”。
你的任务是帮助用户解决Python编程中遇到的问题，提供清晰的解释、相关的代码示例和最佳实践建议。

行为指南：
- 当用户提出编程问题时，首先尝试理解问题的核心。
- 如果合适，请提供简洁、可运行的Python代码片段作为示例。
- 解释代码的工作原理。
- 如果用户的问题不明确，可以适当提问以获取更多信息。
- 保持友好和鼓励的态度。
- 如果问题涉及到非常高级或罕见的库，而你不太确定，可以建议用户查阅官方文档。
- 专注于Python语言本身及其常用库（如os, sys, requests, datetime, json等）。对于非常专业的第三方库（如TensorFlow深度学习细节），你可以提供通用概念，但避免给出未经证实的复杂代码。
"""
            </code></pre>

            <h4>步骤2：创建编程助手的聊天提示模板和链</h4>
            <pre><code class="language-python">
programming_assistant_prompt_template = ChatPromptTemplate.from_messages([
    SystemMessagePromptTemplate.from_template(programming_assistant_system_prompt),
    HumanMessagePromptTemplate.from_template("{user_code_question}")
])

programming_assistant_chain = programming_assistant_prompt_template | qwen_llm | StrOutputParser()

print("\n\n--- 案例2：基础编程助手 ---")
print("编程助手码师爷已上线，请提出你的Python编程问题。")

def ask_programming_assistant(question):
    print(f"\n用户: {question}")
    try:
        response = programming_assistant_chain.invoke({"user_code_question": question})
        print(f"码师爷:\n{response}") # LLM可能会返回包含Markdown格式的代码块
    except Exception as e:
        print(f"编程助手出错: {e}")

# 测试对话
ask_programming_assistant("如何在Python中读取一个文本文件的内容？")
ask_programming_assistant("我想要获取当前日期和时间，有什么简单的方法吗？")
ask_programming_assistant("请解释一下Python中的列表推导式，并给个例子。")
ask_programming_assistant("帮我写一个用快速排序算法对数字列表排序的函数。")
            </code></pre>
            <p>编程助手“码师爷”会尝试根据其“专业知识”（由系统提示定义）来回答Python相关问题，并可能生成代码片段。输出的格式（如代码块）通常由LLM自行决定，但也可以通过更复杂的提示或输出解析器来规范。</p>

            <h3>构建特定角色AI应用的关键点</h3>
            <ul>
                <li><strong>详细的系统提示词：</strong> 这是最重要的部分。系统提示词应该清晰地定义：
                    <ul>
                        <li><strong>角色名称和身份：</strong> 例如“你是XX领域的专家YY”。</li>
                        <li><strong>核心职责/目标：</strong> AI应该做什么。</li>
                        <li><strong>知识边界：</strong> AI应该知道什么，不应该知道什么。</li>
                        <li><strong>行为准则/沟通风格：</strong> 如何与用户互动（友好、正式、简洁等）。</li>
                        <li><strong>限制和禁止行为：</strong> 例如“不要编造信息”，“避免讨论敏感话题”。</li>
                        <li><strong>特定指令：</strong> 例如“如果需要，请提供代码示例”，“总是先确认用户需求”。</li>
                    </ul>
                </li>
                <li><strong>上下文信息：</strong> 如果角色需要特定的背景知识（如客服助手的产品信息），应在系统提示中提供，或者通过RAG机制（参考9.1节）动态注入。</li>
                <li><strong>迭代和测试：</strong> 设计好初步的系统提示后，需要通过大量的测试对话来检验其效果，并根据表现不断迭代优化提示内容。</li>
                <li><strong>温度参数：</strong> 根据角色的需求调整LLM的<code>temperature</code>。需要精确回答的角色（如客服）适合低温度，需要创意的角色（如故事写手）可以适当提高温度。</li>
                <li><strong>Memory（可选但推荐）：</strong> 对于需要进行多轮对话的角色型应用，集成Memory模块（参考9.4节）可以显著提升用户体验。</li>
            </ul>
            <p>通过这些方法，你可以利用Langchain和Qwen模型构建出各种各样具有特定角色和能力的AI应用，满足不同场景的需求。</p>
        </section>
        
        <div class="navigation">
            <a href="../langchain_tutorial_outline.html">返回教程目录</a>
            <a href="../chapter9/chapter9_application_chatbot.html">上一节：9.4 开发一个具备上下文理解能力的聊天机器人</a>
            <!-- <a href="../chapter10/chapter10_prompt_engineering_advanced.html">下一章：AI系统提示词设计进阶</a> -->
        </div>
    </div>
</body>
</html>
